package com.example.ecommercemarketing.enums;

import lombok.Getter;

import java.util.HashMap;
import java.util.Map;

/**
 * 参与营销活动的商品大类枚举
 *
 * <p>定义系统中所有参与营销活动的商品分类</p>
 * <p>每个枚举值包含分类编码和中文名称两个属性</p>
 * <p>提供根据编码快速查找枚举的静态方法</p>
 */
@Getter
public enum ProductCategory {

    /**
     * 电子产品分类
     */
    ELECTRONICS("electronics", "电子产品"),

    /**
     * 家居用品分类
     */
    HOME_APPLIANCES("homeAppliances", "家居用品"),

    /**
     * 服装配饰分类
     */
    CLOTHING("clothing", "服装配饰"),

    /**
     * 美妆个护分类
     */
    BEAUTY("beauty", "美妆个护"),

    /**
     * 食品生鲜分类
     */
    FOOD("food", "食品生鲜");

    /**
     * 分类编码
     * <p>用于系统内部标识和存储，用于URL参数等场景</p>
     * <p>示例："electronics"</p>
     */
    private final String code;

    /**
     * 分类中文名称
     * <p>示例："电子产品"</p>
     */
    private final String name;

    /**
     * 枚举构造函数
     * @param code 分类编码
     * @param name 分类名称
     */
    ProductCategory(String code, String name) {
        this.code = code;
        this.name = name;
    }

    /**
     * 分类编码到枚举的映射缓存
     * <p>用于提高根据编码查找枚举的性能</p>
     */
    public static final Map<String, ProductCategory> PRODUCT_CATEGORY_MAP = new HashMap<>();

    static {
        // 遍历所有枚举值，建立编码到枚举的映射关系
        for (ProductCategory productCategory : ProductCategory.values()) {
            PRODUCT_CATEGORY_MAP.put(productCategory.code, productCategory);
        }
    }

    /**
     * 根据分类编码获取对应的枚举实例
     * <p>使用HashMap实现O(1)时间复杂度的查找</p>
     * @param code 分类编码
     * @return 对应的枚举实例，如果不存在返回null
     */
    public static ProductCategory getCategoryByCode(String code) {
        return PRODUCT_CATEGORY_MAP.get(code);
    }

    /**
     * 根据分类编码获取对应的枚举实例（备用方法）
     * <p>遍历查找方式，在PRODUCT_CATEGORY_MAP未初始化时使用</p>
     * @param code 分类编码
     * @return 对应的枚举实例，如果不存在返回null
     */
    public static ProductCategory getCategoryFromCode(String code) {
        // 遍历所有枚举值进行匹配
        for (ProductCategory category : ProductCategory.values()) {
            if (category.getCode().equals(code)) {
                return category;
            }
        }
        return null;
    }
}